﻿#pragma once

#include <functional>

#include <xy/math/matrix.h>

namespace xy
{

namespace solver
{

using func11 = std::function<double(double)>;                                    // 一元函数 R -> R
using funcx1 = std::function<double(const xy::math::vecxd &)>;                   // 多元函数 Rn -> R
using func1x = std::function<xy::math::vecxd(double)>;                           // 一元向量函数 R -> Rn
using funcxx = std::function<xy::math::vecxd(const xy::math::vecxd &)>;          // 多元向量函数 Rn -> Rm
using funcxxt = std::function<xy::math::vecxd(const xy::math::vecxd &, double)>; // 多元 + t 向量函数

struct nonlinear
{
    /**
     * @brief 求解一元方程 f(x) = 0
     *
     * @param[in] f
     * @param[in] x
     * @return double
     */
    [[nodiscard]] static double solve(func11 f, double x);

    /**
     * @brief 求解多元方程 f(x) = 0
     *
     * @param[in] f
     * @param[in] x
     * @return xy::math::vecxd
     */
    [[nodiscard]] static xy::math::vecxd solve(funcxx f, xy::math::vecxd x);
};

} // namespace solver

} // namespace xy
